from dashscope import Generation
from django.http import StreamingHttpResponse
from django.views.decorators.http import require_GET
from http import HTTPStatus


def generate_sse(responses):  # 定义一个生成器函数，用于生成服务器发送事件（Server-Sent Events）
    for response in responses:  # 遍历响应对象
        if response.status_code == HTTPStatus.OK:  # 检查响应状态码是否为200
            data1 = response.output.choices[0]['message']['content']  # 获取模型生成的文本
            if data1:
                data = f"data: {data1}\n\n"  # 使用f-string格式化字符串，并添加必要的换行符
                yield data.encode('utf-8')  # 必须编码为字节串


@require_GET  # 使用require_GET装饰器限制请求方法为GET
def sse_notifications(request):  # 定义一个GET请求的处理函数
    user_input = request.GET.get('ask')  # 调用函数获取用户输入
    messages = [{'role': 'user', 'content': user_input}]  # 初始化消息列表

    responses = Generation.call(
        model="qwen-turbo",  # 设置模型名称
        messages=messages,  # 设置消息列表
        result_format='message',  # 设置输出格式为message
        stream=True,  # 设置输出方式为流式输出
        incremental_output=True  # 增量式流式输出
    )

    response = StreamingHttpResponse(  # 使用StreamingHttpResponse类创建一个流式响应对象
        generate_sse(responses),  # 使用生成器函数生成响应内容
        content_type="text/event-stream; charset=utf-8",  # 设置正确的字符编码
    )
    response["Cache-Control"] = "no-cache"  # 禁用缓存
    return response # 返回流式响应对象
